﻿using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using TI_4_Limonade_Fabriek.Logging;

namespace TI_4_Limonade_Fabriek.Database
{
    class DatabaseController
    {

        #region variabelen declaratie
        public MySqlConnection conn;
        private MySqlTransaction trans = null;
        ErrorLogging er;
        #endregion

        //Publieke constructor, aangeroepen wanneer er een object gemaakt wordt van een overervende klasse.
        public DatabaseController()
        {
            er = new ErrorLogging();
            try
            {
                //Initialiseren connectie met de MySql server.
                conn = new MySqlConnection("Server=172.16.50.130;Port=3306;Database=Ti_G;Uid=root;Pwd=WaarIsWally;Convert Zero Datetime=True");
            }
            catch (Exception e)
            {
                //Laten zien van de error message en daarna gehele error message loggen.
                MessageBox.Show("Geen connectie met de database! Check error log.");
                er.LogErrorMsg(e.ToString());
            }
        }
        public void Connect()
        {
            try
            {
                conn.Open();
            }
            catch (Exception e)
            {
                //Laten zien van de error message en daarna gehele error message loggen.
                MessageBox.Show("Kan geen connectie maken met de database.");
                er.LogErrorMsg(e.ToString());
            }
        }
        public void Disconnect()
        {
            try
            {
                conn.Close();
            }
            catch (Exception e)
            {
                //Laten zien van de error message en daarna gehele error message loggen.
                MessageBox.Show("Kan geen connectie maken met de database.");
                er.LogErrorMsg(e.ToString());
            }
        }

        //Methode die wordt gebruikt voor de Update, Delete en Insert query's
        public void ExecuteQueryWithoutResult(String query, List<MySqlParameter> parameters)
        {
            try
            {
                //Beginnen transactie met de database.
                trans = conn.BeginTransaction();

                //Nieuw commando voor de MySql server aanmaken.
                MySqlCommand cmd = new MySqlCommand(query, conn);

                //Als er parameters in de parameter lijst staan moeten deze toegevoegd worden aan het MySql commando.
                if (parameters != null)
                {
                    foreach (MySqlParameter param in parameters)
                    {
                        cmd.Parameters.Add(param);
                    }
                }
                //Preparen en uitvoeren van de query. Daarna de transactie afsluiten.
                cmd.Prepare();
                cmd.ExecuteNonQuery();
                trans.Commit();
            }
            catch (Exception e)
            {
                //Transactie ongedaan maken, dit uit bescherming van de database.
                trans.Rollback();

                //Laten zien van de error message en daarna gehele error message loggen.
                MessageBox.Show("Er is een fout opgetreden in het bewerken van de database. Check error log.");
                er.LogErrorMsg(e.ToString());
            }
        }
        
        //Methode die wordt gebruikt voor Select statements.
        //LET OP! DATAREADER SLUITEN!
        public MySqlDataReader ExecuteQueryWithResult(String query, List<MySqlParameter> parameters)
        {
            try
            {
                //Nieuw commando voor de MySql server aanmaken.
                MySqlCommand cmd = new MySqlCommand(query, conn);

                //Als er parameters in de parameter lijst staan moeten deze toegevoegd worden aan het MySql commando.
                if (parameters != null)
                {
                    cmd.Parameters.AddRange(parameters.ToArray());
                }

                //Preparen en uitvoeren van de query.
                cmd.Prepare();
                MySqlDataReader dataReader = cmd.ExecuteReader();

                return dataReader;
            }
            catch (Exception e)
            {
                //Laten zien van de error message en daarna gehele error message loggen.
                MessageBox.Show("Er is een fout opgetreden in het lezen van de database. Check error log.");
                er.LogErrorMsg(e.ToString());
                return null;
            }

        }
    }
}
